package nckd.wnqjt.tmc.tda.plugin.form;

import com.alibaba.fastjson.JSON;
import kd.bos.ai.util.JsonUtil;
import kd.bos.algo.DataSet;
import kd.bos.algo.JoinType;
import kd.bos.algo.Row;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.entity.AppInfo;
import kd.bos.entity.AppMetadataCache;
import kd.bos.entity.qing.*;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.form.IFormView;
import kd.bos.form.IPageCache;
import kd.bos.form.ShowType;
import kd.bos.form.control.IQingAnalysis;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.list.ListShowParameter;
import kd.bos.mvc.SessionManager;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
import kd.bos.report.ReportShowParameter;
import kd.bos.servicehelper.QueryServiceHelper;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhujintao
 * @date 2024/11/05
 * @desc  账户分布
 */
public class AccountDistributionQingDataProvider extends AbstractFormPlugin implements IQingDataProvider {



    /**
     * 获取表头信息定义
     */
    @Override
    public QingMeta getMeta(String pageId) {
        String entityKey = "am_accountbank";
        QingMeta meta = new QingMeta();
        EntryEntity entity = new EntryEntity();
        entity.setKey(entityKey); //实体名(唯一标识)	是
        entity.setName(new LocaleString("账户查询")); //实体别名	是
        entity.setPkFieldName("id");//主键名称	是
        meta.addEntryEntity(entity);

        Field column = new Field();
        column.setEntity(entityKey);//字段所属实体key	否
        column.setKey("id");// 字段名(唯一标识)	是
        column.setFieldType(QingFieldType.Int.toNumber()); //数据类型	是
        column.setName(new LocaleString("id")); //字段别名	是
        meta.addColumn(column);

        column = new Field();
        column.setEntity(entityKey);//字段所属实体key	否
        column.setKey("companyname");// 字段名(唯一标识)	是
        column.setFieldType(QingFieldType.String.toNumber()); //数据类型	是
        column.setName(new LocaleString("申请组织")); //字段别名	是
        meta.addColumn(column);

        column = new Field();
        column.setEntity(entityKey);
        column.setKey("bankaccountnumber");
        column.setFieldType(QingFieldType.String.toNumber());
        column.setName(new LocaleString("银行账号"));
        meta.addColumn(column);

        column = new Field();
        column.setEntity(entityKey);
        column.setKey("opendate");
        column.setFieldType(QingFieldType.DateTime.toNumber());
        column.setName(new LocaleString("开户日期"));
        meta.addColumn(column);

        column = new Field();
        column.setEntity(entityKey);
        column.setKey("bankcategory");
        column.setFieldType(QingFieldType.String.toNumber());
        column.setName(new LocaleString("银行类别"));
        meta.addColumn(column);

        column = new Field();
        column.setEntity(entityKey);
        column.setKey("acctproperty");
        column.setFieldType(QingFieldType.String.toNumber());
        column.setName(new LocaleString("账户用途"));
        meta.addColumn(column);
        return meta;
    }

    /**
     * 获取轻分析数据
     *
     * @param startRow 起始行
     * @param limit    每页的数据量
     * @return 轻分析数据
     */
    @Override
    public QingData getData(String pageId, int startRow, int limit) {
        //拿过滤条件，进行取数
        String qFilter = getPageCache().get("qFilter");
        if (qFilter != null) {
            //通过此方法拿到过滤参数
            Map<String, Object> filterParam = (Map) JSON.parseObject(qFilter, Map.class);
        }
        //"路径：【银企互联】-【余额查询 bei_bankbalance 】
        //（子公司上存余额+子公司当前余额）/
        //子公司当前余额+母公司当前余额+虚拟户【受限资金管理】+虚拟户投资理财
        //通过 余额查询  获取 子公司上存余额+子公司当前余额
        //再根据 资金调度-基础设置-母子账户组 获取母公司的账户 再通过余额查询获取到母公司的当前余额
        //通过受限资金管理的类型未“增加受限”的获取 当前可解除受限金额 和 定期存款处理 的 存款金额"
        //String algoKey, String entityName, String selectFields, QFilter[] filters, String orderBys

        //FI-015 结算中心
        QFilter accountQfilter = new QFilter("bank.finorgtype.number", QCP.not_equals, "FI-015").and("acctstatus", QCP.not_equals, "closed");
        String amAccountbankSelectField = "id,company.id companyid,company.number companynumber,company.name companyname" +
                ",acctproperty.id acctpropertyid,acctproperty.number acctpropertynumber,acctproperty.name acctpropertyname,bankaccountnumber,opendate" +
                ",bank.id bankid,bank.number banknumber,bank.name bankname,bank.bank_cate.id bankbankcateid,bank.bank_cate.number bankbankcatenumber,bank.bank_cate.name bankbankcatename";
        //账户查询
        DataSet beiBankbalanceSubsidiaryDataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "am_accountbank", amAccountbankSelectField, accountQfilter.toArray(), null);

        QingData data = null;
        if (startRow < 200) {
            data = new QingData();
            Map<String, Integer> dataindex = new HashMap<String, Integer>();
            dataindex.put("id", 0);
            dataindex.put("companyname", 1);
            dataindex.put("bankaccountnumber", 2);
            dataindex.put("opendate", 3);
            dataindex.put("bankcategory", 4);
            dataindex.put("acctproperty", 5);
            data.setDataindex(dataindex);

            List<Object[]> rows = new ArrayList<Object[]>();
            while (beiBankbalanceSubsidiaryDataSet.hasNext()) {
                Row row = beiBankbalanceSubsidiaryDataSet.next();
                Object[] obj = new Object[6];
                obj[0] = row.getLong("id");
                obj[1] = row.getString("companyname");
                obj[2] = row.getString("bankaccountnumber");
                Timestamp timestamp = (Timestamp) row.get("opendate");
                long time = timestamp.getTime();
                obj[3] = time;
                obj[4] = row.getString("bankbankcatename");
                obj[5] = row.getString("acctpropertyname");
                rows.add(obj);
            }
            data.setRows(rows);
        }
        return data;
    }


    @Override
    public void setFilterParameter(String filterParameter) {
        IPageCache pageCache = getPageCache();
        pageCache.put("qFilter", filterParameter);

    }

    @Override
    public String getFilterParameter() {
        return getPageCache().get("qFilter");
    }

    /**
     * 获取动态表单联查信息
     *
     * @param pageId
     * @param ctrKey
     * @return
     */
    @Override
    public List<QingLinkageInfo> getLinkageInfo(String pageId, String ctrKey) {
        //return IQingDataProvider.super.getLinkageInfo(pageId, ctrKey);
        List<QingLinkageInfo> infos = new ArrayList<QingLinkageInfo>();
        QingLinkageInfo info = new QingLinkageInfo();
        Map<String, String> formKey = new HashMap<>();
        AppInfo appInfo = AppMetadataCache.getAppInfo("am");
        //String appId = this.getView().getFormShowParameter().getAppId();
        formKey.put("AppId", appInfo.getAppId()); //需要打开的表单所在应用的id
        //String formId = this.getView().getFormShowParameter().getFormId();
        formKey.put("FormId", "nckd_acctdistributionrpt"); //需要打开的表单的id
        formKey.put("System", "IERP");
        formKey.put("CtrKey", ctrKey);
        info.setFormKey(JsonUtil.encodeToString(formKey));
        info.setFormDisplayName("账户分布明细报表");//联查到表单的显示名称
        info.setFormPrimaryKey("id");//联查到表单的主键
        infos.add(info);//可以添加多个QingLinkageInfo对象
        this.getView().getPageCache().put("qingViewControlKey", ctrKey);//必要语句!
        return infos;
    }

    /**
     * <p>调用此接口，触发业务逻辑，具体业务联查实现此接口<p/>
     *
     * @param ids    轻分析得到动态表单需要联査的1d的集合
     * @param pageId
     * @param formId
     * @param appId
     */
    @Override
    public void fireLinkageInfo(List<String> ids, String pageId, String formId, String appId) {
        //IQingDataProvider.super.fireLinkageInfo(ids, pageId, formId, appId);
        /*具体的表单打开逻辑，业务自己去实现
        ids:联查到的主键的值
        pageId:触发联査的页面的pageId，可用于找到触发联査的页面: FormView view = (FormView)Sessiomanager.getCurrent().getView(pageId)
        formId:联查到的表单的id
        appId:联查到的表单所在应用的Id
        */

        /*注意: 如果需要使用芒穹的view.showForm 方式打开表单，需要添加以下代码*/
        // 组装 FormShomParaneter(披照业务场景亲实现)
        ReportShowParameter reportShowParameter = new ReportShowParameter();
        reportShowParameter.getOpenStyle().setShowType(ShowType.Modal);
        reportShowParameter.setAppId(appId);
        reportShowParameter.setFormId(formId);//报表标识
        //拿过滤条件，进行取数
        String qFilter = getPageCache().get("qFilter"); //从仪表板进去 拿不到
        //通过此方法拿到过滤参数
        Map<String, Object> filterParam = new HashMap<>();
        // 设置报表过滤条件
        ReportQueryParam reportQueryParam = new ReportQueryParam();
        //FilterInfo filterInfo = new FilterInfo();
        //filterInfo.addFilterItem("nckd_orgview", filterParam.get("nckd_orgview"));
        //filterInfo.addFilterItem("nckd_org", filterParam.get("nckd_org"));
        //filterInfo.addFilterItem("nckd_currency", filterParam.get("nckd_currency"));
        //filterInfo.addFilterItem("bizdate", filterParam.get("nckd_querydate"));
        //filterInfo.addFilterItem("nckd_amountunit", filterParam.get("nckd_amountunit"));
        filterParam.put("id", ids);
        //reportQueryParam.setFilter(filterInfo);
        reportQueryParam.setCustomParam(filterParam);
        reportShowParameter.setQueryParam(reportQueryParam);

        /*******************************showForm必要的代码******************************************/
        IFormView view = SessionManager.getCurrent().getView(pageId);
        String ctrKey = this.getView().getPageCache().get("qingViewControlKey");
        if (ctrKey != null) {
            if (view.getControl(ctrKey) instanceof IQingAnalysis) {
                //设计器的场景，直接showForm
                view.showForm(reportShowParameter);
                return;
            }
        }
        //其他场景需要，返回FormShowParameter，由轻分析来 showForm
        this.getView().setClientReturnData(ListShowParameter.toJsonString(reportShowParameter));
        /*******************************showForm必要的代码******************************************/
    }
}